Изменения данных редко происходят поодиночке: при переводе нужно списать средства с одного счёта и зачислить их на другой, а при оформлении заказа — зарезервировать товар и зафиксировать оплату. Если система остановится на полпути, база данных будет описывать мир, которого никогда не существовало. Транзакция — это ответ базы данных на эту проблему: последовательность одной или нескольких операций, которые база данных рассматривает как единую, неделимую единицу работы.
Всё или ничего
Внутри транзакции каждая операция принадлежит одному результату. База данных никогда не показывает завершённое состояние, в котором выполнена лишь часть транзакции. Классический пример — перевод между двумя банковскими счетами: сначала уменьшается баланс счёта-отправителя, затем увеличивается баланс счёта-получателя. Если бы выполнился только первый шаг, деньги бы исчезли; если бы только второй — появились бы из ниоткуда. Объединение обоих шагов в одну транзакцию исключает обе эти возможности.
Эта гарантия "всё или ничего" называется атомарностью. Фиксация — это действие, которое делает изменения транзакции постоянными; транзакция, которая так и не была зафиксирована, не оставляет никаких следов. Долговечность добавляет последний элемент: как только фиксация завершилась, изменение сохраняется, даже если машина потеряет питание мгновение спустя.
Транзакция — это граница
Полезно представлять транзакцию как границу, очерченную вокруг группы инструкций. До этой границы и после неё данные удовлетворяют правилам, которые налагает структура. Внутри границы существуют промежуточные состояния — с одного счёта уже списаны средства, а на другой ещё не зачислены, — но эти состояния приватны для транзакции. Последующие инструкции в других сессиях не воспринимают их как истину.
Две задачи одновременно
Таким образом, транзакции выполняют две задачи. Первая — обработка сбоев: если процесс аварийно завершится, соединение оборвётся или инструкция вызовет ошибку, база данных может восстановить состояние, существовавшее до начала транзакции. Вторая — управление видимостью: пока работа выполняется, другие читатели ограждены от незавершённого результата. Эти две задачи связаны, но не идентичны — атомарность определяет, сохраняются ли изменения, тогда как видимость регулируется уровнем изоляции — настройкой, которая управляет тем, насколько параллельные транзакции могут видеть друг друга.
